//
//  "$Id: Faceboard.h 94652 2012-12-24 05:20:41Z lei_yixing $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __FaceBoard_API_H__
#define __FaceBoard_API_H__

#include "Types.h"
#include "Defs.h"
#include "Keyboard.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup FaceBoardAPI API FaceBoard
/// 面板接口，包括报警输入输出，接受外部电平输入或者触发继电器控制
///	外部电路；视频矩阵接口，连接外部的视频矩阵。
/// 以及基本上所有的传感器输入和控制输出，并不局限于面板上的接口，
/// 泛指所有简单IO接口。
///	\n 调用流程图:
/// \code
///    ===========================
///                |
///         createFaceBoard
///                |
///              addRef
///                |
///             getCaps
///                |------------+
///           readAlarm         |
///                |            |
///           writeAlarm        |
///                |            |
///              read           |
///                |            |
///              write          |
///                |            |
///           matrixVideo       |
///                |------------+
///             release
///                |
///    ===========================
/// \endcode
/// @{

// DVR数字键映射
#define KEY_0            (uchar)('0')
#define KEY_1            (uchar)('1')
#define KEY_2            (uchar)('2')
#define KEY_3            (uchar)('3')
#define KEY_4            (uchar)('4')
#define KEY_5            (uchar)('5')
#define KEY_6            (uchar)('6')
#define KEY_7            (uchar)('7')
#define KEY_8            (uchar)('8')
#define KEY_9            (uchar)('9')
#define KEY_10           (uchar)('0')
#define KEY_11           (uchar)('q')
#define KEY_12           (uchar)('w')
#define KEY_13           (uchar)('e')
#define KEY_14           (uchar)('r')
#define KEY_15           (uchar)('t')
#define KEY_16           (uchar)('y')
#define KEY_10PLUS       VK_OEM_3    // '~`'

// DVR导航键映射
#define KEY_UP            VK_UP
#define KEY_DOWN          VK_DOWN
#define KEY_LEFT          VK_LEFT
#define KEY_RIGHT         VK_RIGHT
#define KEY_SHIFT         VK_ALT
#define KEY_PGUP /*跳进*/ VK_PRIOR
#define KEY_PGDN /*跳退*/ VK_NEXT
#define KEY_RET /*回车*/  VK_RETURN
#define KEY_ESC /*退出*/  VK_ESCAPE
#define KEY_FUNC /*辅助*/ VK_CONTROL

// DVR快捷键映射
#define KEY_REC /*录像*/       VK_F1
#define KEY_SEARCH /*查询*/    VK_F2
#define KEY_INFO /*信息*/      VK_F3
#define KEY_ALARM /*报警*/     VK_F4
#define KEY_ADDR /*地址*/      VK_F5
#define KEY_BACKUP /*备份*/    VK_F6
#define KEY_SPLIT /*多画面*/   VK_F7
#define KEY_SPLIT1 /*单画面*/  VK_F8
#define KEY_SPLIT4 /*4画面*/   VK_F9
#define KEY_SPLIT8 /*8画面*/   VK_F10
#define KEY_SPLIT9 /*9画面*/   VK_F11
#define KEY_SPLIT16 /*16画面*/ VK_F12
#define KEY_SNAPSHOT /*抓图*/  VK_SNAPSHOT
#define KEY_SHUT /*关机*/      VK_SLEEP

// DVR回放键映射
#define KEY_PLAY /*播放/暂停*/ VK_MEDIA_PLAY_PAUSE
#define KEY_BACK /*倒放*/      VK_BACK
#define KEY_STOP /*停止*/      VK_MEDIA_STOP     // ''"' for US
#define KEY_FAST /*快放*/      VK_OEM_PLUS  // '+' any country
#define KEY_SLOW /*慢放*/      VK_OEM_MINUS // '-' any country
#define KEY_NEXT /*下一段*/    VK_MEDIA_NEXT_TRACK
#define KEY_PREV /*上一段*/    VK_MEDIA_PREV_TRACK
#define KEY_STEPF /*向前单帧*/ VK_OEM_6    //  ']}' for US
#define KEY_STEPB /*向后单帧*/ VK_OEM_4    //  '[{' for US
#define KEY_STEPX /*单帧播放*/ VK_OEM_5    //  '\|' for US
#define KEY_SPEED /*速度控制*/ 0x101	   //  飞梭键速度控制，位移量

// DVR云台控制键映射
#define KEY_PTZ           VK_NUMPAD8   // '8' 云台控制菜单
#define KEY_TELE          VK_NUMPAD7   // '7' 望远
#define KEY_WIDE          VK_NUMPAD9   // '9' 广角
#define KEY_IRIS_CLOSE    VK_NUMPAD1   // '1' 光圈小
#define KEY_IRIS_OPEN     VK_NUMPAD3   // '3' 光圈大
#define KEY_FOCUS_NEAR    VK_NUMPAD4   // '4' 焦距拉近
#define KEY_FOCUS_FAR     VK_NUMPAD6   // '6' 焦距拉远
#define KEY_BRUSH         VK_NUMPAD5   // '5' 雨刷
#define KEY_LIGHT         VK_NUMPAD2   // '2' 灯光
#define KEY_SPRESET       VK_ADD       // '+' 设置预置点
#define KEY_GPRESET       VK_MULTIPLY  // '*' 转到预置点
#define KEY_DPRESET       VK_SUBTRACT  // '-' 删除预置点
#define KEY_PATTERN       VK_NUMPAD0   // 云台模式
#define KEY_SCAN          VK_DECIMAL   // '.' 点间巡航
#define KEY_AUTOPAN       VK_DIVIDE    // '/' 线扫
#define KEY_AUTOTOUR      VK_SCROLL     // scroll lock

// DVR读取默认键映射
#define KEY_RESET			VK_OEM_RESET // 恢复出厂设置

#define KEY_ZOOM			VK_ZOOM		// 缩放，位移量

// 对讲与报警系统按钮
#define	KEY_110 /*紧急按钮*/                VK_OEM_0XE8
#define	KEY_ENTER_SAFEMODE/*进入安全模式*/  VK_F13
#define	KEY_LEAVE_SAFEMODE/*退出安全模式*/  VK_F14
#define	KEY_ENABLE_ALARM /*报警布防*/       VK_F15
#define	KEY_DISABLE_ALARM /*报警撤防*/      VK_F16
#define KEY_ASTERISK /*星号键*/             VK_F17
#define KEY_HASH /*井号键*/                 VK_F18
#define KEY_DIAL /*拨号键，呼叫室内机*/     VK_F19
#define KEY_CENTER /*呼叫管理中心键*/       VK_F20
#define KEY_ACCEPT /*听筒接听键*/       	VK_F21
#define KEY_HANGUP /*听筒挂断键*/       	VK_F22

/// 面板特性，32位系统下128字节
typedef struct FaceBoardCaps
{
	char alarmInputs;		///< 报警输入端口数
	char alarmOutputs;		///< 报警输出端口数
	char matrixBoard;		///< 带矩阵板
	char loopBoard;			///< 带环通板
	char matrixInputs;		///< 得到矩阵板的输入路数（一般为视频输入通道数）
	char matrixOutputs;		///< 得到矩阵板的输出路数
	char fanCount;			///< 得到风扇数量
	char temperatureCount;	///< 得到温度传感器数量
	char shiftKey;			///< 是否带shift键
	char numericKey;		///< 是否带独立数字键
	char wiper;				///< 是否支持雨刷控制
	char alarmPir;			///< 是否支持PIR报警
	char flashLight;		/// 是否带有补光灯
	char doors;				///< 门磁个数
	int reserved[28];		///< 保留字节
} FaceBoardCaps;

/// 面板输入码
typedef enum FaceBoardInputCode
{
	faceBoardKey = 0x0000,			///< 按键输入，暂时用KEY_*宏来定义，按键状态，0-弹起，1-按下；位移量，取-1000~1000；
	faceBoardPhotoSensor0 = 0x0200, ///< 光敏传感器，输入状态取值0~100，表示亮度范围
} FaceBoardInputCode;

/// 面板输入命令，32位系统下128字节
typedef struct FaceBoardInput
{
	int code;				///< 输入码，参见FaceBoardInputCode
	int state;				///< 输入状态,不同的输出码对应不同的意义，参见FaceBoardInputCode注释
	char remote;			///< 遥控器标志位，0-前面板数据，1-遥控器数据；
	char placeholder[3];	///< 保留字节
	int reserved[29];		///< 保留字节
} FaceBoardInput;

/// 面板输出码
/// 对于底层指示灯共用的处理（比如状态灯同时作为录像灯，等等）:
/// 1-一个指示灯在一个时刻只能表现一种逻辑灯的状态，不能混合（比如只作为状态灯或只作为录像灯）。
/// 2-点亮的逻辑指示灯优先显示。
/// 3-如果两个都点亮，闪烁的逻辑灯优先显示。
/// 4-如果两个都都闪烁或者都不闪烁，按颜色优先级显示。红色优先，其次黄色，最次绿色。
typedef enum FaceBoardOutputCode
{
	faceBoardRecordLed0		= 0x00,	///< 录像灯, ledRecord* = *，状态参数：0-关闭，1-开启
	faceBoardRemoteLed		= 0x20,	///< 遥控灯，状态参数：0-关闭，1-开启
	faceBoardBackLight		= 0x21,	///< 背光灯，状态参数：0-关闭，1-开启
	faceBoardAlarmLed		= 0x22,	///< 报警灯，状态参数：0-关闭，1-开启
	faceBoardNetLed			= 0x23,	///< 网络连接灯，状态参数：0-关闭，1-开启
	faceBoardStatusLed		= 0x24,	///< 状态灯（双色），状态参数：0-关闭，1-绿色，2-黄色，3-红色
	faceBoardKeepAlive		= 0x25,	///< 保活命令，初始状态保活机制应关闭，状态参数：保活时间，单位为ms
	faceBoardDisplayPower	= 0x26, ///< 显示器电源控制，状态参数：0-关闭，1-开启
	faceBoardWiFiLed		= 0x27, ///< WiFi灯，状态参数：0-关闭，1-开启
	faceBoardVideoLed		= 0x28, ///< 视频灯，状态参数：0-关闭，1-开启
	faceBoardStorageLed		= 0x29, ///< 存储灯，状态参数：0-关闭，1-开启
	faceBoardBatteryLed		= 0x2a, ///< 电池灯（双色），状态参数：0-关闭，1-绿色，2-黄色，3-红色
	faceBoardVfdTime		= 0x2b,	///< 液晶屏时间设置命令，状态参数：保留
	faceBoardWiper			= 0x2c,	///< 雨刷控制，状态参数：0-关闭，1-开启
	faceBoardFlashLight		= 0x2d,	///< 补光灯， 状态参数: 0-关闭，1-开启
	faceBoardUnInterruptLed	= 0x2e, ///< 免打扰指示灯，状态参数：0-关闭，1-开启
	faceBoardTemperatureLed	= 0x2f, ///< 温度报警灯（双色），状态参数：0-关闭，1-蓝色，2-紫色，3-红色
	faceBoardCCamearLed		= 0x30, ///< 卡片机指示灯，状态参数：RGB颜色
	faceBoardAlarmPowerLed0	= 0x40, ///< 电源报警灯（双色），状态参数：0-关闭，1-蓝色，2-紫色，3-红色
	faceBoardAlarmTemperatureLed0	= 0x60, ///< 温度报警灯（双色），状态参数：0-关闭，1-蓝色，2-紫色，3-红色
	faceBoardAlarmMatrixCardLed0	= 0x80, ///< 视频矩阵子卡报警灯，状态参数：0-关闭，1-开启
	faceBoardFillInLight	= 0x0200, ///< 补光灯，状态参数：0-关闭，1-开启
	faceBoardCallStatusLed  = 0x0201, ///< 呼叫状态指示灯（双色），状态参数: 0-关闭，1-蓝色，2-紫色，3-红色
	faceBoardParkingSpaceInsideLight		= 0x0300,		///< 停车位内置灯，状态参数：RGB颜色
	faceBoardParkingSpaceOutsideLightBegin	= 0x0301,		///< 停车位第一盏外接灯, 状态参数：RGB颜色
	//faceBoardParkingSpaceOutSideLightN	= 0x0301+(N-1),	///< 停车位第N盏外接灯，状态参数：RGB颜色
	faceBoardParkingSpaceOutsideLightEnd	= 0x0311,		///< 停车位最后一盏外接灯, 状态参数：RGB颜色

} FaceBoardOutputCode;

/// 面板输出命令，32位系统下128字节
typedef struct FaceBoardOutput
{
	int code;				///< 输出码，参见FaceBoardOutputCode
	int state;				///< 输出状态，不同的输出码对应不同的意义，参见FaceBoardOutputCode注释
	short onCycle;			///< 指示灯闪烁的点亮时间，单位为毫秒，onCycle和offCycle任何一个为0表示不闪烁
	short offCycle;			///< 指示灯闪烁的熄灭时间，单位为毫秒
	Color color;			///< 指示灯颜色
	int reserved[28];		///< 保留字节
} FaceBoardOutput;

/// 面板和机箱状态
typedef struct FaceBoardState
{
	float globalTemperature;	///< 环境温度，单位为摄氏度
	uint batteryPersent:7;		///< 电池容量百分比,0-100
	uint batteryLowPower:1;		///< 电量报警状态，0-电量充足，1-电量不足
	uint batteryCharging:1;		///< 充电状态，0-没有充电，1-正在充电
	int maskPowerState;			///< 电源状态位码, 最低位表示0号电源, 0-电源打开, 1-电源关闭
	int reserved[29];
} FaceBoardState;

/// 风扇类型
typedef enum FanType
{
	fanCPU			= 0x00,		///< CPU风扇
	fanMainboard0	= 0x40,		///< 主板风扇
	fanPower0		= 0x80,		///< 电源风扇
	fanCabinet0		= 0xC0,		///< 机柜风扇
} FanType;

/// 风扇状态
typedef struct FanState
{
	int fanType;			///< 风扇类型
	int	speed;				///< 风扇转速，单位：转/分
	int maxSpeed;			///< 风扇最大转速，单位：转/分
	int reserved[29];
} FanState;

/// 温度传感器类型
typedef enum TemperatureType
{
	temperatureGlobal		= 0x10,		///< 环境温度传感器
	temperatureMainboard0	= 0x40,		///< 主板温度传感器
	temperaturePower0		= 0x80,		///< 电源温度传感器
	temperatureCabinet0		= 0xC0,		///< 机柜温度传感器
	temperatureCard0		= 0x100,	///< 子卡温度传感器
} TemperatureType;

/// 温度传感器状态
typedef struct TemperatureState
{
	int type;				///< 温度传感器类型
	float temperature;		///< 温度值，单位为摄氏度
	int reserved[30];
} TemperatureState;

/// 卡信息
typedef struct FaceBoardCard
{
	char number[32];		///< 卡号
	int reserved[24];		///< 保留
} FaceBoardCard;



///< 通用LED配置参数
typedef struct CommLedState
{
	Color onColor;			///< 亮灯颜色
	Color offColor;			///< 灭灯颜色
	short onCycle;			///< 亮灯时间，单位ms
	short offCycle;			///< 灭灯时间，单位ms
	unsigned int strength;	///< 光亮强度(0-1000)
	int reserved[60];		///< 保留
} CommLedState;


/// LED灯状态
typedef struct LedState
{
	int ledId;				///< 物理灯编号

	union
	{
		CommLedState commLedState;		///< 通用LED配置参数
		int reserved[128];				///< 保留
	};

	int reserved1[31];					///< 保留
} LedState;

///key id 类型
typedef enum
{
	keyIdBell,                          ///< 门铃按键
	keyIdRest,                          ///<复位按键
} KeyIdType;

/// key状态
typedef struct
{
	int keyId;				            ///< 按键id，参见KeyIdType
	int reserved1[31];					///< 保留
} KeyState;

///射频 id 类型
typedef enum
{
	rfIdBell,                          ///< 控制门铃铃声
} RfIdType;

/// 射频模块状态
typedef struct
{
	int rfId;				            ///< 模块id，参见RfIdType
	int reserved1[31];					///< 保留
} RfModuleState;

///alarm id 类型
typedef enum
{
    alarmIdPir,                          ///< pir模块
} AlarmIdType;

/// 传感器报警模块状态
typedef struct
{
	int alarmId;				        ///< 模块id，参见AlarmType
	int enableWakeup;                   ///< 是否使能唤醒，0：不使能；1：使能
    int enableAlarm;                    ///< 是否使能报警，0：不使能；1：使能
    int sensitivity;                    ///< 检测灵敏度，1--100，100灵敏度最高
	int reserved1[28];					///< 保留
} AlarmModuleState;

/// 面板接口，128个指针
typedef struct FaceBoard
{
	/// 底层私有数据
	void *priv;


	/// 增加接口引用
	int (*addRef)(struct FaceBoard *thiz);


	/// 释放接口
	int (*release)(struct FaceBoard *thiz);

	/// 获取面板特性
	///
	/// \param [in] thiz 面板接口指针
	/// \param [out] caps 面板特性指针
	int (*getCaps)(struct FaceBoard *thiz, FaceBoardCaps *caps);


	/// 读报警输入状态，状态改变时或出错时返回，否则阻塞。
	///
	/// \param [in] thiz 面板接口指针
	/// \param [out] pData 指向一个UInt32值的指针，uint32值是各个报警输入通道电平状态的掩码。
	///	       低通道在低位，高通道在高位。高电平置1，低电平置0，不存在的通道置0。
	/// \retval >0  读出的字节数
	/// \retval <=0 读失败
	int (*readAlarm)(struct FaceBoard *thiz, ulong* pData);


	/// 写报警输出状态。
	///
	/// \param [in] thiz 面板接口指针
	/// \param [in] pData 指向一个UInt32值的指针，uint32值是各个报警输出通道的掩码。低通道在
	///	       低位，高通道在高位。置1输出高电平，置0输出低电平，不存在的通道位无效。
	/// \return >0  写入的字节数
	/// \retval <=0 写失败
	int (*writeAlarm)(struct FaceBoard *thiz, ulong* pData);


	/// 连接视频矩阵的输出通道和输入通道。
	/// 
	/// \param [in] thiz 面板接口指针
	/// \param [in]  in 视频输入通道号，从0开始
	/// \param [in]  out 视频输出通道号，从0开始
	/// \retval 0  连接成功。
	/// \retval <0  连接失败。
	int (*matrixVideo)(struct FaceBoard *thiz, uchar in, uchar out);


	/// 读取面板命令。
	/// 
	/// \param [in] thiz 面板接口指针
	/// \param [out]  input 面板输入结构指针
	/// \retval 0  读成功。
	/// \retval <0  读失败。
	int (*read)(struct FaceBoard *thiz, FaceBoardInput * input);


	/// 写面板命令。
	/// 
	/// \param [in] thiz 面板接口指针
	/// \param [out]  output 面板输出结构指针
	/// \retval 0  写成功。
	/// \retval <0  写失败。
	int (*write)(struct FaceBoard *thiz, FaceBoardOutput * output);


	/// 机箱或面板状态检测
	/// \param [in] thiz 面板接口指针
	/// \param [out]  state 面板状态结构指针
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*probe)(struct FaceBoard *thiz, FaceBoardState * state);


	/// 获取风扇状态
	/// \param [in] thiz 面板接口指针
	/// \param [in] index 风扇序号
	/// \param [out] state 风扇状态输出结构指针
	/// \retval 0  读成功。
	/// \retval <0  读失败。
	int (*getFanState)(struct FaceBoard *thiz, int index, FanState * state);


	/// 获取温度传感器状态
	/// \param [in] thiz 面板接口指针
	/// \param [in] index 温度传感器序号
	/// \param [out] state 温度传感器状态输出结构指针
	/// \retval 0  读成功。
	/// \retval <0  读失败。
	int (*getTemperatureState)(struct FaceBoard *thiz, int index, TemperatureState * state);


	/// 设置风扇转速
	/// \param [in] thiz 面板接口指针
	/// \param [in] fan 风扇类型
	/// \param [in] speed 风扇转速，单位：转/每分
	/// \retval 0  设置成功。
	/// \retval <0  设置失败。
	int (*setFanSpeed)(struct FaceBoard *thiz, FanType fan, int speed);


	/// 读取卡信息，状态改变时或出错时返回，否则阻塞。
	/// \param [in] thiz 面板接口指针
	/// \param [in] card 卡信息
	/// \retval 0  读取成功。
	/// \retval <0  读取失败。
	int (*readCard)(struct FaceBoard *thiz, FaceBoardCard* card);


	/// 开启门磁
	/// \param [in] thiz 面板接口指针
	/// \param [in] index 门磁编号，从0开始
	/// \param [in] open 0-关,1-开
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*openDoor)(struct FaceBoard *thiz, int index, int open);


	/// 设置LED灯颜色、亮灭时间、光亮强度 
	/// \param [in] thiz 面板接口指针
	/// \param [in] ledState led灯控制参数 
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*setLed)(struct FaceBoard *thiz, LedState* ledState);

	/// 获取按键状态
	/// \param [in] thiz 面板接口指针
	/// \param [out] value 按键值
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*getKey)(struct FaceBoard *thiz, KeyState *keyDtate, unsigned int *value);

	/// 控制射频模块
	/// \param [in] thiz 面板接口指针
	/// \param [in] rfState 射频模块控制参数 
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*ctlRfModule)(struct FaceBoard *thiz, RfModuleState* rfState);

	/// 设置pir、烟雾等报警传感器
	/// \param [in] thiz 面板接口指针
	/// \param [in] alarmState 报警模块控制参数 
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*setAlarmModule)(struct FaceBoard *thiz, AlarmModuleState* alarmState);

	/// 获取传感器报警状态
	/// \param [in] thiz 面板接口指针
	/// \param [in] alarmId报警模块id 
	/// \param [out] value 报警状态值,0,没有触发；1，触发
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*getAlarmModule)(struct FaceBoard *thiz, int alarmId, unsigned int *value);

	/// 保留字节
	void* reserved[108];
} FaceBoard;


/// 面板接口描述结构，32位系统下128字节
typedef struct FaceBoardDesc
{
	int reserved[32];	///< 保留字节
} FaceBoardDesc;


/// 创建面板接口
///
/// \param [in] desc 面板接口描述结构FaceBoardDesc的指针
/// \param [out] faceBoard 面板接口指针的指针
/// \retval 0  连接成功。
/// \retval <0  连接失败。
int PAL_API createFaceBoard(FaceBoardDesc *desc, FaceBoard **faceBoard);

/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__FaceBoard_API_H__

